home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2003 August / MW 8 2003 CD1.iso / Inside Macworld / Product News / gimp-1.2.4.sit / gimp-1.2.4 / plug-ins / gimpressionist / plasma.c < prev    next >
Encoding:
C/C++ Source or Header  |  2003-02-13  |  2.0 KB  |  82 lines

  1. #include <stdlib.h>
  2. #include <time.h>
  3. #include <math.h>
  4. #include "gimpressionist.h"
  5. #include "ppmtool.h"
  6.  
  7. #include <libgimp/gimpmath.h>
  8.  
  9. int pfix(int n)
  10. {
  11.   if(n<1) return 1;
  12.   if(n>255) return 255;
  13.   return n;
  14. }
  15.  
  16. #define PIXEL(y,x,z) p->col[(y)*rowstride+(x)*3+z]
  17.  
  18. void mkplasma_sub(struct ppm *p, int x1, int x2, int y1, int y2, float turb)
  19. {
  20.   int rowstride = p->width * 3;
  21.   int r=0;
  22.   int xr, yr, nx, ny;
  23.   xr = abs(x1-x2);
  24.   yr = abs(y1-y2);
  25.  
  26.   if((xr==0) && (yr==0)) return;
  27.  
  28.   nx = (x1+x2)/2;
  29.   ny = (y1+y2)/2;
  30.   if(!PIXEL(y1,nx,r))
  31.     PIXEL(y1,nx,r) = pfix((PIXEL(y1,x1,r)+PIXEL(y1,x2,r))/2.0+
  32.                            turb*(RAND_FUNC()%xr-xr/2.0));
  33.   if(!PIXEL(y2,nx,r))
  34.     PIXEL(y2,nx,r) = pfix((PIXEL(y2,x1,r)+PIXEL(y2,x2,r))/2.0+
  35.                            turb*(RAND_FUNC()%xr-xr/2.0));
  36.   if(!PIXEL(ny,x1,r))
  37.     PIXEL(ny,x1,r) = pfix((PIXEL(y1,x1,r)+PIXEL(y2,x1,r))/2.0+
  38.                          turb*(RAND_FUNC()%yr-yr/2.0));
  39.   if(!PIXEL(ny,x2,r))
  40.     PIXEL(ny,x2,r) = pfix((PIXEL(y1,x2,r)+PIXEL(y2,x2,r))/2.0+
  41.                          turb*(RAND_FUNC()%yr-yr/2.0));
  42.   if(!PIXEL(ny,nx,r))
  43.     PIXEL(ny,nx,r) = 
  44.       pfix((PIXEL(y1,x1,r)+PIXEL(y1,x2,r)+PIXEL(y2,x1,r)+
  45.             PIXEL(y2,x2,r))/4.0+turb*(RAND_FUNC()%(xr+yr)/2.0-(xr+yr)/4.0));
  46.  
  47.   if(xr>1) {
  48.     mkplasma_sub(p,x1,nx,y1,ny, turb);
  49.     mkplasma_sub(p,nx,x2,y1,ny, turb);
  50.   }
  51.   if(yr>1) {
  52.     mkplasma_sub(p,x1,nx,ny,y2, turb);
  53.     mkplasma_sub(p,nx,x2,ny,y2, turb);
  54.   }
  55. }
  56.  
  57. void mkplasma_red(struct ppm *p, float turb)
  58. {
  59.   int x=0, y=0;
  60.   int rowstride = p->width * 3;
  61.  
  62.   for(x = 0; x < p->width; x++)
  63.     for(y = 0; y < p->height; y++)
  64.       PIXEL(y,x,0) = 0;
  65.   x--; y--;
  66.   PIXEL(0,0,0) = 1+RAND_FUNC()%255;
  67.   PIXEL(y,0,0) = 1+RAND_FUNC()%255;
  68.   PIXEL(0,x,0) = 1+RAND_FUNC()%255;
  69.   PIXEL(y,x,0) = 1+RAND_FUNC()%255;
  70.   mkplasma_sub(p, 0, x, 0, y, turb);
  71. }
  72.  
  73. void mkgrayplasma(struct ppm *p, float turb)
  74. {
  75.   int y,l;
  76.  
  77.   mkplasma_red(p, turb);
  78.   l = p->width * 3 * p->height;
  79.   for(y = 0; y < l; y += 3)
  80.     p->col[y+1] = p->col[y+2] = p->col[y];
  81. }
  82.